﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;

namespace App_Persistencia
{
    public class Alimento_Data
    {
        int id;

        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        string nombre;

        public string Nombre
        {
            get { return nombre; }
            set { nombre = value; }
        }
        string descripcion;

        public string Descripcion
        {
            get { return descripcion; }
            set { descripcion = value; }
        }
        float precio;

        public float Precio
        {
            get { return precio; }
            set { precio = value; }
        }
        int insumo;

        public int Insumo
        {
            get { return insumo; }
            set { insumo = value; }
        }
        int tipo_Alimento;

        public int Tipo_Alimento
        {
            get { return tipo_Alimento; }
            set { tipo_Alimento = value; }
        }
        private string foto_Plato;

        public string Foto_Plato
        {
            get { return foto_Plato; }
            set { foto_Plato = value; }
        }

        private List<Alimento_Detalle_Data> detalle = new List<Alimento_Detalle_Data>();

        public List<Alimento_Detalle_Data> Detalle
        {
            get { return detalle; }
            set { detalle = value; }
        }

        private Alimento_Grupo_Data alimentoGrupo;

        public Alimento_Grupo_Data AlimentoGrupo
        {
            get { return alimentoGrupo; }
            set { alimentoGrupo = value; }
        }


        public static DataTable listarAlimento()
        {
            string commandSQL = "SELECT        Alimento.ali_Id as Numero, Alimento.ali_Nombre as Nombre, Alimento.ali_Descripcion as Descripcion, Alimento_Tipo.tAli_Nombre as TipoAlimento " +
                                  "FROM            Alimento INNER JOIN " +
                               "Alimento_Tipo ON Alimento.tipoAlimento_Id = Alimento_Tipo.tAli_Id";
            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Alimento");

            //creo la vista de la consulta
            DataTable dataTable = new DataTable();

            //Cargo la Vista con el contenido de la tabla de resultados.. creo un dataTable, hasta insumo noma'
            dataTable = dataSet.Tables["Alimento"];

            // Obtengo la tabla del DataSet
            //DataTable dataTable = dataSet.Tables["Ejercicio"];

            return dataTable;

            // --- Vercion Profesor con edicion de GridView retorno dataTAble

        }


        public DataTable listarAlimentoXGrupo(int idEvento)
        {
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = null;
            DataSet dataSet = null;
            DataTable dataTable = null;
            string commandSQL = "";
            if (idEvento != -1)
            {
                commandSQL = "SELECT Alimento.grupoAlimento_Id AS Grupo"
                            + " FROM Menu INNER JOIN "
                            + " EventoxMenu ON Menu.menu_Id = EventoxMenu.menu_Id INNER JOIN "
                            + " Menu_Detalle ON Menu.menu_Id = Menu_Detalle.menu_Id INNER JOIN "
                            + " Evento ON EventoxMenu.evento_Id = Evento.eve_Id INNER JOIN "
                            + " Alimento ON Menu_Detalle.alimento_Id = Alimento.ali_Id "
                            + " WHERE (Alimento.tipoAlimento_Id = 3) AND (Evento.eve_Id = " + idEvento + ")";

                dataAdapter = new SqlDataAdapter(commandSQL, conexion);
                dataSet = new DataSet();
                dataAdapter.Fill(dataSet, "Alimento");
                dataTable = new DataTable();
                dataTable = dataSet.Tables["Alimento"];
                this.AlimentoGrupo.Nombre = dataTable.Rows[0]["Grupo"].ToString();
            }


            commandSQL = "SELECT Alimento.ali_Id AS Numero, Alimento.ali_Nombre AS Nombre, Alimento.ali_Descripcion AS Descripcion, Alimento.ali_Foto AS FotoPlato "
                         + " FROM Alimento INNER JOIN Alimento_Tipo ON Alimento.tipoAlimento_Id = Alimento_Tipo.tAli_Id "
                         + " WHERE(Alimento.grupoAlimento_Id = " + this.AlimentoGrupo + ") AND (Alimento.tipoAlimento_Id = 3)";
            dataAdapter = new SqlDataAdapter(commandSQL, conexion);
            dataSet = new DataSet();
            dataAdapter.Fill(dataSet, "Alimento");
            dataTable = dataSet.Tables["Alimento"];
            return dataTable;

        }


        public static DataTable buscarAlimentosPorTipo(int idTipoAlimento)
        {
            string commandSQL = "SELECT ali_Id, ali_Nombre FROM Alimento WHERE tipoAlimento_Id = " + idTipoAlimento;


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Alimento");

            //creo la vista de la consulta
            DataTable dataTable = new DataTable();

            //Cargo la Vista con el contenido de la tabla de resultados.. creo un dataTable, hasta insumo noma'
            dataTable = dataSet.Tables["Alimento"];

            // Obtengo la tabla del DataSet
            //DataTable dataTable = dataSet.Tables["Ejercicio"];

            return dataTable;

            // --- Vercion Profesor con edicion de GridView retorno dataTAble

        }

        public static DataTable buscarAlimentosPorMenu(int idMenu)
        {
            string commandSQL = "SELECT Alimento.ali_Id, Alimento.ali_Nombre, Alimento_Tipo.tAli_Nombre FROM Alimento, Alimento_x_Menu, Alimento_Tipo WHERE Alimento.ali_Id = Alimento_x_Menu.alimento_Id and Alimento.tipoAlimento_Id = Alimento_Tipo.tAli_Id and Alimento_x_Menu.menu_Id ="+ idMenu;


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Alimento");

            //creo la vista de la consulta
            DataTable dataTable = new DataTable();

            //Cargo la Vista con el contenido de la tabla de resultados.. creo un dataTable, hasta insumo noma'
            dataTable = dataSet.Tables["Alimento"];

            // Obtengo la tabla del DataSet
            //DataTable dataTable = dataSet.Tables["Ejercicio"];

            return dataTable;

            // --- Vercion Profesor con edicion de GridView retorno dataTAble

        }

        public DataTable buscarAlimentosPorTipos(string tipo)
        {
            string commandSQL = "SELECT ali_Id as Id, ali_Nombre as Nombre FROM Alimento, Alimento_Tipo WHERE tipoAlimento_Id = tAli_id AND tAli_Nombre = '" + tipo +"'";

            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "actTipo");

            //creo la vista de la consulta
            DataView dataView = new DataView();

            //Cargo la Vista con el contenido de la tabla de resultados
            dataView = dataSet.Tables["actTipo"].DefaultView;

            // Obtengo la tabla del DataSet
            DataTable dataTable = dataSet.Tables["actTipo"];

            return dataTable;
        }

        public void guardarAlimento()
        {
            // Crear el Objeto de conexion, inicializa con la cadena de conexion
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            // Abro la conexion
            connection.Open();

            //Invoco al Objeto SqlTransaction para manejar la transaccion  
            //ejecuto la transaccion
            SqlTransaction transaccion = connection.BeginTransaction();

            try
            {
                // Creo el Objeto Command, le asigno la conexion y el Procediminto a utilizar
                System.Data.SqlClient.SqlCommand command = new System.Data.SqlClient.SqlCommand();
                //Asigno a la propiedad Transaction del Objeto SqlCommand el valor del Objeto SqlTransaction
                command.Transaction = transaccion;
                //Asingo la conexion al objeto conection
                command.Connection = connection;
                command.CommandText = "spCargarAlimento";
                command.CommandType = CommandType.StoredProcedure;

                // Declaro el Objeto de parametro
                System.Data.SqlClient.SqlParameter param;

                param = command.Parameters.AddWithValue("@Id", Id);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Output;

                param = command.Parameters.AddWithValue("@Descripcion", Descripcion);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Nombre", Nombre);
                param.DbType = DbType.String;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@TipoAlimento", Tipo_Alimento);
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                param = command.Parameters.AddWithValue("@Grupo", alimentoGrupo.Id );
                param.DbType = DbType.Int32;
                param.Direction = ParameterDirection.Input;

                // Ejecuto el procedimiento
                command.ExecuteNonQuery();

                Id = Convert.ToInt32(command.Parameters["@Id"].Value);

                //cargar el detalle
                foreach (Alimento_Detalle_Data ali in detalle)
                {
                    ali.Alimento_Id = Id;
                    ali.guardarDetalle(transaccion, connection);

                }
                //Si no se genero ningun error en la carga ejecuto el commit
                transaccion.Commit();
            }
            catch (SystemException e)
            {
                //si se produjo algun error lo capturo y ejecuto el Rollback de la transaccion
                transaccion.Rollback();
                //provoco una Exepcion para la capa superior
                System.Diagnostics.Trace.Write(e.Message);

                throw new SystemException(e.Message);
            }
            finally
            {
                //Si termino la carga correctamente cierro la conexion
                connection.Close();
            }

        }

        public DataTable cargarAlimentoDetalles(int idAlimento)
        {
            //Creo la sentencia SQL
            string commandSQL = "SELECT        Insumo.ins_Nombre AS Insumo, Alimento_Detalle.dAli_Cantidad AS Cantidad, Unidad_Medida.uMed_Nombre AS Medida,  " +
                         " Insumo.ins_Precio AS Precio_por_Medida_en_$ " +
                        "  FROM            Alimento INNER JOIN " +
                       "   Alimento_Detalle ON Alimento.ali_Id = Alimento_Detalle.alimento_Id INNER JOIN " +
                       "   Insumo ON Alimento_Detalle.insumo_Id = Insumo.ins_Id INNER JOIN " +
                       "   Unidad_Medida ON Insumo.unidadMedida_Id = Unidad_Medida.uMed_Id  " +
                      "    WHERE        (Alimento.ali_Id = " + idAlimento + " )";


            // Creo el Objeto DataAdapter y le paso la cadena al constructor y la sentencia SQL
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            SqlDataAdapter dataAdapter = new SqlDataAdapter(commandSQL, conexion);

            // Creo el Objeto DataSet
            DataSet dataSet = new DataSet();

            // Relleno el Objeto DataSet
            dataAdapter.Fill(dataSet, "Alimento");

            //creo la vista de la consulta
            DataTable dataTable = new DataTable();

            //Cargo la Vista con el contenido de la tabla de resultados
            dataTable = dataSet.Tables["Alimento"];


            return dataTable;

            // --- Vercion Profesor con edicion de GridView

        }
        public string buscarFotoAlimento(int idMenu)
        {
            //Crear el Objeto de conexion, inicializa con la cadena de conexion            
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            try
            {
                connection.Open();

                SqlCommand cmd = new SqlCommand(" SELECT   Alimento.ali_Foto as Foto " +
               " FROM      Menu_Detalle INNER JOIN " +
                  "  Menu ON Menu_Detalle.menu_Id = Menu.menu_Id INNER JOIN " +
                   " Alimento ON Menu_Detalle.alimento_Id = Alimento.ali_Id INNER JOIN " +
                 "   Alimento_Tipo ON Alimento.tipoAlimento_Id = Alimento_Tipo.tAli_Id " +
                 "  WHERE   (Alimento_Tipo.tAli_Id = 3) AND (Menu.menu_Id = " + idMenu + " ) ", connection);

                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    // el dr.GetString(0) si sabemos el orden de las columnas, es muy rapido, pero medio complicado de leer o saber bien
                    Foto_Plato = dr["Foto"].ToString();
                }

            }
            catch (Exception e)
            {
                e.ToString();
            }

            finally
            {
                // Cierro la conexion
                connection.Close();
            }
            return Foto_Plato;
        }

        /// <summary>
        /// esto esta hecho a los ponchazos porque necesitaba sio si la foto
        /// </summary>
        /// <param name="idAlimento"></param>
        /// <returns></returns>
        public string buscarFotoAlimento2(int idAlimento)
        {
            //Crear el Objeto de conexion, inicializa con la cadena de conexion            
            string conexion = ConfigurationManager.ConnectionStrings["CadenaConexion"].ConnectionString;
            System.Data.SqlClient.SqlConnection connection = new SqlConnection(conexion);

            try
            {
                connection.Open();

                SqlCommand cmd = new SqlCommand(" SELECT   ali_Foto as Foto" +
                            " FROM      Alimento " + 
                            " WHERE   (ali_Id = " + idAlimento + " ) ", connection);

                SqlDataReader dr = cmd.ExecuteReader();

                while (dr.Read())
                {
                    // el dr.GetString(0) si sabemos el orden de las columnas, es muy rapido, pero medio complicado de leer o saber bien
                    Foto_Plato = dr["Foto"].ToString();
                }

            }
            catch (Exception e)
            {
                e.ToString();
            }

            finally
            {
                // Cierro la conexion
                connection.Close();
            }
            return Foto_Plato;
        }

    }
}
